home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 49 / Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso / -serious- / graphics / amicad / arexx / importfile1.0 < prev    next >
Text File  |  1999-12-06  |  11KB  |  378 lines

  1. /* Chargement d'un fichier version 1.0 */
  2. /* 3 Février 1999: version 1.01 (doublage guillemets dans textes, correction DRAWMODE bus) */
  3. /* 21 février 1999: version 1.02 (modif appel REQFILE, correction routine lire_chaine ) */
  4. /* 25 mars 1999: version 1.03 (ajout SETDEV, setclip(chemin_AmiCAD)) */
  5. /* 17 avril 1999: version 1.04 (utilisation DELETE(-1) */
  6. /* 19 avril 1999: version 1.05 (modification traitement largeur trait pour DRAWMODE) */
  7. /* 22 mai 1999: version 1.06 (correction test fichier) */
  8. /* $VER: ImportFile 1.06 (© R.Florac, 22/05/99) */
  9.  
  10. options results     /* indispensable pour récupérer le résultat des macros */
  11.  
  12. signal on error     /* pour l'interception des erreurs */
  13. signal on syntax
  14.  
  15. 'VERSION(0)'
  16. if result < 2 then do
  17.     'MESSAGE("Ce script nécessite"+CHR(10)+"AmiCAD version 2")'
  18.     exit
  19. end
  20.  
  21. fichier=0
  22. 'SELSHEET(-1)'; nf=result
  23. 'OBJECTS(-1)'; objets=result
  24. if objets>0 then do
  25.     'REQUEST("Le document actuel"+CHR(10)+"contient déjà 'objets' objets"+CHR(10)+"Voulez-vous charger"+CHR(10)+"ce fichier dans une"+CHR(10)+"nouvelle fenêtre?")'
  26.     if result=1 then do
  27.     'NEW("")'
  28.     'SELSHEET(-1)'; nf=result
  29.     end
  30.     else do
  31.     'REQUEST("Voulez-vous conserver"+CHR(10)+"les objets actuels?"+CHR(10)+"Le nouveau schéma sera"+CHR(10)+"chargé par dessus.")'
  32.     if result=0 then do
  33.         'SELSHEET('nf'):DELETE(-1)'
  34.     end
  35.     end
  36. end
  37.  
  38. chemin=getclip(chemin_AmiCAD)
  39. if chemin="" then chemin="Travail:AmiCAD/Schémas"
  40. 'REQFILE("Fichier à charger?","'chemin'","")'; f=result
  41. if f="" then exit
  42.  
  43. if open(fichier,f,'READ') then do
  44.     setclip(chemin_AmiCAD, ParseFileName(f,PATH))
  45.     entete=lire_chaine(fichier)
  46.     if entete~="AmiCADFile 1.0" then do
  47.     if entete="AmiCADFile 1.1" then do
  48.         close(fichier)
  49.         'REQUEST("Ce fichier est au"+CHR(10)+"nouveau format!"+CHR(10)+"Voulez-vous le charger?")'
  50.         if result = 1 then 'LOAD("'f'")'
  51.         exit
  52.     end
  53.     else 'MESSAGE("Format fichier incorrect")'
  54.     close(fichier)
  55.     exit
  56.     end
  57.     'SELSHEET('nf'):WTOFRONT('nf'):FILENAME("'f'"):LOCK(-1)'
  58.     objets=0; objet=0; gmaxi=0
  59.     do until eof(fichier)
  60.     groupe=0
  61.     type=lire_octet(fichier)
  62.     largeur_trait=1
  63.     if type='FIN' then leave
  64.     if type>63 then do
  65.         if type>127 then do
  66.         groupe=1
  67.         type=type-128
  68.         end
  69.         if type>63 then do
  70.         largeur_trait=lire_octet(fichier)
  71.         type=type-64
  72.         end
  73.         else largeur_trait=1
  74.     end
  75.     if largeur_trait>3 then largeur_trait=0-largeur_trait
  76.     if groupe~=0 then groupe=lire_valeur(fichier)
  77.     select
  78.         when type=1 then do     /* composant */
  79.         comp=lire_chaine(fichier)
  80.         circuit=lire_octet(fichier)
  81.         if circuit>0 then 'SETDEV(0,'circuit')'
  82.         x0=lire_valeur(fichier)
  83.         y0=lire_valeur(fichier)
  84.         call lire_mode(fichier)
  85.         call lire_echelles(fichier)
  86.         'DRAWMODE('largeur_trait'):CONVERT(0,0):SETPINS(0,1):PUTPART("'comp'",'x0','y0')';
  87.         objet=result; composant=objet
  88.         objets=objets+1
  89.         end
  90.         when type=13 then do    /* Définition fenêtre */
  91.         lt=lire_valeur(fichier)
  92.         ht=lire_valeur(fichier)
  93.         lf=lire_valeur(fichier)
  94.         hf=lire_valeur(fichier)
  95.         xg=lire_valeur(fichier)
  96.         yh=lire_valeur(fichier)
  97.         xo=lire_valeur(fichier)
  98.         yo=lire_valeur(fichier)
  99.         'SELSHEET('nf'):DIMSHEET('lt','ht'):WINDOW('xg','yh','lf','hf'):LOCK('nf')'
  100.         end
  101.         when type=14 then do    /* Définition bibliothèque */
  102.         lib=lire_chaine(fichier)
  103.         'LOADLIB("'lib'")'
  104.         end
  105.         when type=2 then do     /* fil de liaison */
  106.         x0=lire_valeur(fichier)
  107.         y0=lire_valeur(fichier)
  108.         x1=lire_valeur(fichier)
  109.         y1=lire_valeur(fichier)
  110.         'DRAWMODE(1):DRAW('x0','y0','x1','y1')'; objet=result
  111.         objets=objets+1
  112.         end
  113.         when type=3 then do     /* arc de cercle */
  114.         'DRAWMODE('largeur_trait')'
  115.         x0=lire_valeur(fichier)
  116.         y0=lire_valeur(fichier)
  117.         rh=lire_valeur(fichier)
  118.         rv=lire_valeur(fichier)
  119.         ad=lire_valeur(fichier)
  120.         af=lire_valeur(fichier)
  121.         'ARC('x0','y0','rh','rv','ad','af')'; objet=result
  122.         objets=objets+1
  123.         end
  124.         when type=4 then do     /* texte */
  125.         'DRAWMODE('largeur_trait')'
  126.         t=lire_chaine(fichier)
  127.         x0=lire_valeur(fichier)
  128.         y0=lire_valeur(fichier)
  129.         call lire_mode(fichier)
  130.         call lire_echelles(fichier)
  131.         'WRITE("'doublage_guillemets(t)'",'x0','y0')'; objet=result
  132.         objets=objets+1
  133.         end
  134.         when type=5 then do     /* référence composant */
  135.         'DRAWMODE('largeur_trait')'
  136.         t=lire_chaine(fichier)
  137.         x0=lire_valeur(fichier)
  138.         y0=lire_valeur(fichier)
  139.         call lire_mode(fichier)
  140.         call lire_echelles(fichier)
  141.         'WRITE("'t'",'x0','y0')'; objet=result
  142.         'LINKREF('composant','objet')'
  143.         objets=objets+1
  144.         end
  145.         when type=6 then do     /* valeur composant */
  146.         'DRAWMODE('largeur_trait')'
  147.         t=lire_chaine(fichier)
  148.         x0=lire_valeur(fichier)
  149.         y0=lire_valeur(fichier)
  150.         call lire_mode(fichier)
  151.         call lire_echelles(fichier)
  152.         'WRITE("'t'",'x0','y0')'; objet=result
  153.         'LINKVAL('composant','objet')'
  154.         objets=objets+1
  155.         end
  156.         when type=23 | type=7 then do    /* connexion */
  157.         x0=lire_valeur(fichier)
  158.         y0=lire_valeur(fichier)
  159.         call lire_echelles(fichier)
  160.         if type=23 then 'CONVERT(0,1)'
  161.         else 'CONVERT(0,0)'
  162.         'JUNCTION('x0','y0')'; objet=result
  163.         objets=objets+1
  164.         end
  165.         when type=8 then do     /* pointillés */
  166.         x0=lire_valeur(fichier)
  167.         y0=lire_valeur(fichier)
  168.         x1=lire_valeur(fichier)
  169.         y1=lire_valeur(fichier)
  170.         'DRAWMODE(0):DRAW('x0','y0','x1','y1')'; objet=result
  171.         objets=objets+1
  172.         end
  173.         when type=9 then do     /* bus */
  174.         x0=lire_valeur(fichier)
  175.         y0=lire_valeur(fichier)
  176.         x1=lire_valeur(fichier)
  177.         y1=lire_valeur(fichier)
  178.         'DRAWMODE(3):DRAW('x0','y0','x1','y1')'; objet=result
  179.         objets=objets+1
  180.         end
  181.         when type=10 then do    /* ellipse */
  182.         'DRAWMODE('largeur_trait')'
  183.         x0=lire_valeur(fichier)
  184.         y0=lire_valeur(fichier)
  185.         rh=lire_valeur(fichier)
  186.         rv=lire_valeur(fichier)
  187.         'ELLIPSE('x0','y0','rh','rv')'; objet=result
  188.         objets=objets+1
  189.         end
  190.         when type=11 then do    /* connecteur entrée */
  191.         'DRAWMODE('largeur_trait')'
  192.         t=lire_chaine(fichier)
  193.         x0=lire_valeur(fichier)
  194.         y0=lire_valeur(fichier)
  195.         call lire_mode(fichier)
  196.         call lire_echelles(fichier)
  197.         'INPUT("'t'",'x0','y0')'; objet=result
  198.         objets=objets+1
  199.         end
  200.         when type=12 then do    /* connecteur de sortie */
  201.         'DRAWMODE('largeur_trait')'
  202.         t=lire_chaine(fichier)
  203.         x0=lire_valeur(fichier)
  204.         y0=lire_valeur(fichier)
  205.         call lire_mode(fichier)
  206.         call lire_echelles(fichier)
  207.         'OUTPUT("'t'",'x0','y0')'; objet=result
  208.         objets=objets+1
  209.         end
  210.         when type=15 then do    /* trait double */
  211.         'DRAWMODE(2)'
  212.         x0=lire_valeur(fichier)
  213.         y0=lire_valeur(fichier)
  214.         x1=lire_valeur(fichier)
  215.         y1=lire_valeur(fichier)
  216.         'DRAW('x0','y0','x1','y1')'; objet=result
  217.         objets=objets+1
  218.         end
  219.         when type=16 then do    /* composant sans bornes */
  220.         comp=lire_chaine(fichier)
  221.         circuit=lire_octet(fichier)
  222.         if circuit>0 then 'SETDEV(0,'circuit')'
  223.         x0=lire_valeur(fichier)
  224.         y0=lire_valeur(fichier)
  225.         call lire_mode(fichier)
  226.         call lire_echelles(fichier)
  227.         'DRAWMODE('largeur_trait'):CONVERT(0,0):SETPINS(0,0):PUTPART("'comp'",'x0','y0')'; objet=result; composant=objet
  228.         objets=objets+1
  229.         end
  230.         when type=17 then do    /* définition groupe */
  231.         do 5
  232.             lt=lire_valeur(fichier)
  233.         end
  234.         end
  235.         when type=19 then do    /* NOM_SYMBOLE_ALTERNÉ */
  236.         comp=lire_chaine(fichier)
  237.         circuit=lire_octet(fichier)
  238.         if circuit>0 then 'SETDEV(0,'circuit')'
  239.         x0=lire_valeur(fichier)
  240.         y0=lire_valeur(fichier)
  241.         call lire_mode(fichier)
  242.         call lire_echelles(fichier)
  243.         'DRAWMODE('largeur_trait'):CONVERT(0,1):SETPINS(0,1):PUTPART("'comp'",'x0','y0')'; objet=result; composant=objet
  244.         objets=objets+1
  245.         end
  246.         when type=20 then do    /* NOM_SYMBOLE_ALTERNÉ_SANS_BORNES */
  247.         comp=lire_chaine(fichier)
  248.         circuit=lire_octet(fichier)
  249.         if circuit>0 then 'SETDEV(0,'circuit')'
  250.         x0=lire_valeur(fichier)
  251.         y0=lire_valeur(fichier)
  252.         call lire_mode(fichier)
  253.         call lire_echelles(fichier)
  254.         'DRAWMODE('largeur_trait'):CONVERT(0,1):SETPINS(0,0):PUTPART("'comp'",'x0','y0')'; objet=result; composant=objet
  255.         objets=objets+1
  256.         end
  257.         when type=21 then do    /* Trait personnalisé */
  258.         lt=lire_octet(fichier)
  259.         'DRAWMODE('0-lt')'
  260.         x0=lire_valeur(fichier)
  261.         y0=lire_valeur(fichier)
  262.         x1=lire_valeur(fichier)
  263.         y1=lire_valeur(fichier)
  264.         'DRAW('x0','y0','x1','y1')'; objet=result
  265.         objets=objets+1
  266.         end
  267.         when type=22 then do    /* boîte */
  268.         lt=lire_octet(fichier)
  269.         'DRAWMODE('0-lt')'
  270.         x0=lire_valeur(fichier)
  271.         y0=lire_valeur(fichier)
  272.         x1=lire_valeur(fichier)
  273.         y1=lire_valeur(fichier)
  274.         'BOX('x0','y0','x1','y1')'; objet=result
  275.         objets=objets+1
  276.         end
  277.         otherwise do
  278.         'MESSAGE("Donnée inconnue: 'type'")'
  279.         leave
  280.         end
  281.     end
  282.     if groupe>0 then do
  283.         if g.groupe ~= "G."||groupe then g.groupe=g.groupe||','||objet
  284.         else g.groupe=objet
  285.         if groupe>gmaxi then gmaxi=groupe
  286.     end
  287.     end
  288.     close(fichier)
  289.     'MESSAGE("Fin de fichier atteinte"+CHR(10)+"'objets' objets lus"):UNLOCK(-1)'
  290.     do i=1 to gmaxi
  291.     if g.i ~= "G."||i then 'GROUP('g.i')'
  292.     end
  293. end
  294. else 'MESSAGE("Ouverture fichier impossible")'
  295. 'UNLOCK(-1)'
  296. exit
  297.  
  298. lire_mode: procedure
  299.     parse arg fichier
  300.     mode=lire_octet(fichier)
  301.     if mode>15 then mode=mode-16
  302.     if mode>7 then mode=mode-8
  303.     if mode>3 then do
  304.     'SYMMETRY(0,1)'
  305.     mode=mode-4
  306.     end
  307.     else 'SYMMETRY(0,0)'
  308.     'ROTATE(0,'mode')'
  309.     return
  310.  
  311. lire_echelles: procedure
  312.     parse arg fichier
  313.     eh=lire_octet(fichier)*100
  314.     ev=lire_octet(fichier)*100
  315.     'SETSCALE(0,'eh','ev')'
  316.     return
  317.  
  318. lire_chaine: procedure
  319.     parse arg fichier
  320.     l=""
  321.     do forever
  322.     c=readch(fichier,1)
  323.     if c='00'x then return l
  324.     l=l||c
  325.     if eof(fichier) then return l   /* au cas où il n'y aurait pas de 0 terminal! */
  326.     end
  327.  
  328. lire_valeur: procedure
  329.     parse arg fichier
  330.     v=lire_octet(fichier)*256
  331.     v=v+lire_octet(fichier)
  332.     return v
  333.  
  334. lire_octet: procedure expose objets
  335.     parse arg fichier
  336.     c=readch(fichier,1)
  337.     if eof(fichier) then return "FIN"
  338.     v=0
  339.     if bittst(c,0) then v=1
  340.     if bittst(c,1) then v=v+2
  341.     if bittst(c,2) then v=v+4
  342.     if bittst(c,3) then v=v+8
  343.     if bittst(c,4) then v=v+16
  344.     if bittst(c,5) then v=v+32
  345.     if bittst(c,6) then v=v+64
  346.     if bittst(c,7) then v=v+128
  347.     return v
  348.  
  349. ParseFileName: procedure
  350.     parse arg FilePath, Part
  351.     Divpos = max(lastpos(':',FilePath),lastpos('/',FilePath))+1
  352.     if abbrev('FILE', upper(Part))
  353.     then return substr(FilePath, DivPos)
  354.     else
  355.     return strip(left(FilePath, DivPos-1), 'T', '/')
  356.  
  357. doublage_guillemets: procedure
  358.     parse arg chaine
  359.     t=''
  360.     do i=1 to length(chaine)
  361.     c = substr(chaine,i,1)
  362.     if c='"' then c=c||'"'
  363.     t=t||c
  364.     end
  365.     return t
  366.  
  367. /* Traitement des erreurs, interruption du programme */
  368. syntax:
  369. erreur=RC
  370. if (fichier) close(fichier)
  371. 'MESSAGE("Erreur de syntaxe"+CHR(10)+"en ligne 'SIGL'"+CHR(10)+"'errortext(erreur)'"):UNLOCK(-1)'
  372. exit
  373.  
  374. error:
  375. if (fichier) close(fichier)
  376. 'MESSAGE("Erreur en ligne 'SIGL'"):UNLOCK(-1)'
  377. exit
  378.